package jvm.autoMemoryManagement;

import java.util.ArrayList;
import java.util.List;

/**
 * @author msi
 * 代码清单2-3 java堆内存溢出异常测试
 *
 * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\dumpFile
 */
public class HeapOOM {
    static class OOMObject{

    }

    public static void main(String[] args) {
        List<OOMObject> list=new ArrayList<>();

        while (true){
            list.add(new OOMObject());
        }
    }
}

/**
 * 运行结果
 * java.lang.OutOfMemoryError: Java heap space
 * Dumping heap to java_pid8724.hprof ...
 * Heap dump file created [28286340 bytes in 0.075 secs]
 * 判断是java堆溢出的条件  OOM: Java heap space。
 * 解决这部分的异常需要用到内存映像分析工具(如 Eclipse Memory Analyzer)对dump出来的堆存储快照进行分析 java_pid5956.hprof
 * 首先确认导致OOM的对象是不是必要的，也就是分清楚到底出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)
 * 如果是内存泄漏可以通过通过工具查看泄漏对象到GC Roots的引用链。如果不是内存泄漏，就要检查JVM的堆设置是否合理。-Xmx  -Xms。
 */
